#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <cstdio>
#include <cstdlib>

static int cnt = 0;
void SignalHandler(int signo)
{
    std::cout << "进程收到信号:" << signo << std::endl;
    // std::cout << "cnt:" << cnt << std::endl;
    // exit(1);
    alarm(1);
}
int main(int argc, char* argv[])
{
    //1.通过键盘发送信号
    // signal(3, SignalHandler);
    // while(true) std::cout << getpid() << "正在运行" << std::endl;


    //2.通过系统调用向进程发信号
    //kill()可以给任意进程发任意信号
    //raise()可以给自己发送任意信号
    //abort()给自己发送指定信号
    //进程收到大部分信号，默认的处理动作都是终止进程
    //信号的意义：代表着不同的事件，但是对不同的事件的处理结果可以一样的
        //kill
    // if(argc != 3)
    // {
    //     std::cout << "请输入./mysignal pid signo" << std::endl; 
    //     exit(1);
    // }
    // int ret = kill(atoi(argv[1]), atoi(argv[2]));
    // if(ret == -1)
    // {
    //     perror("kill");
    //     exit(1);
    // }
        //raise
        // int cnt = 0;
        // while(cnt <= 10)
        // {
        //     std::cout << cnt++ << std::endl;
        //     sleep(1);
        //     if(cnt >= 5)    raise(2);  //kill(gitpid(), signo)
        // }

        // //abort
        // std::cout << "我正在运行" << std::endl;
        // sleep(1);
        // abort();  //kill(gitpid(), 6)





    //3.硬件异常产生信号
    //eg:1
    // signal(SIGFPE, SignalHandler);
    // std::cout << "我正在运行" << std::endl;
    // sleep(1);
    // int ret = 1 / 0; // 为啥会一直收到信号？
    // //cpu的寄存器只有一份，但是寄存器中的内容，属于当前进程的上下文，cpu内还有一个状态寄存器，当发生/0错误的时候
    // //cpu内状态寄存器中对应的标记位由0变1，os识别到了这个异常，就给对应的进程发送信号，
    // //但是当进程进程切换后，进程的上下文由重新加载进寄存器，异常我们自己无法解决，所以状态标记位还是1，所以os由会来检查
    // //不断的重复，不断的给进程发信号
    // while(true)
    // {
    //     std::cout << "我正在运行" << std::endl;
    // }
    //eg:2
    // signal(SIGSEGV, SignalHandler);
    // int* p = nullptr;
    // *p = 100; //访问非法的空间 
    // //cpu内的内存管理单元(MMU)会异常
    // return 0;





    //4.通过软件条件
    //比如管道，当写端关闭时，os会关闭写端的进程
    //再比如alarm
    // signal(SIGALRM, SignalHandler);
    // alarm(1);
    // while(true)
    // {
    //     cnt++; 
    // }



    //核心转储
    // int arr[10] = {1,2,3,4,5,4,6,7};
    // arr[100000] = 1;



    for(int i = 1; i <= 31; ++i)
    {
        signal(i, SignalHandler);
    }
    while(true)
    {
        std::cout << "我正在运行" << "pid:" << getpid() << std::endl;
        sleep(1);
    }
}